{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val plot = new Plot()\n",
    "val y1 = Seq(1.5, 1, 6, 5, 2, 8)\n",
    "val cs = Seq(Color.black, Color.red, Color.gray, Color.green, Color.blue, Color.pink)\n",
    "val ss = Seq(StrokeType.SOLID, StrokeType.SOLID, StrokeType.DASH, StrokeType.DOT, StrokeType.DASHDOT, StrokeType.LONGDASH)\n",
    "plot.add(new Stems{ y = y1; color = cs; style = ss; width = 5})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val plot = new Plot { title = \"Elo\" }\n",
    "var cs = new Color(255, 0, 0, 128)// transparent bars\n",
    "//cs[3] = Color.red // set color of a single bar, solid colored bar\n",
    "plot.add(new Bars{ x = Seq(1, 2, 3, 4); y = Seq(3, 5, 2, 3, 7); color = cs; outlineColor = Color.black; width = 0.3 })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val plot = new Plot { title = \"Changing Point Size, Color, Shape\" }\n",
    "val y1 = Seq(6, 7, 12, 11, 8, 14)\n",
    "val y2 = y1.map(x => x - 1)\n",
    "val y3 = y1.map(x => x - 2)\n",
    "val y4 = y1.map(x => x - 3)\n",
    "plot.add(new Points { y = y1 })\n",
    "plot.add(new Points { y = y2; shape = ShapeType.CIRCLE })\n",
    "plot.add(new Points { y = y3; size = 8.0; shape = ShapeType.DIAMOND })\n",
    "plot.add(new Points { y = y4; size = 12.0; color = Color.orange; outlineColor = Color.red })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val plot = new Plot { title = \"Changing point properties with list\" }\n",
    "val cs = Seq(Color.black, Color.red, Color.orange, Color.green, Color.blue, Color.pink)\n",
    "val ss = Seq(6.0, 9.0, 12.0, 15.0, 18.0, 21.0)\n",
    "val fs = Seq(false, false, false, true, false, false)\n",
    "\n",
    "val list = List(new Points { y = Seq(5,5,5,5,5,5); size = 12.0; color = cs }, \n",
    "                new Points { y = Seq(4,4,4,4,4,4); size = 12.0; color = Color.gray; outlineColor = cs },\n",
    "                new Points { y = Seq(3,3,3,3,3,3); size = 12; color = Color.red },\n",
    "                new Points { y = Seq(2,2,2,2,2,2); size = 12.0; color = Color.black; fill = fs; outlineColor = Color.black })\n",
    "\n",
    "plot.add(list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val plot = new Plot()\n",
    "val ys = Seq(3, 5, 2, 3)\n",
    "val x0 = Seq(0, 1, 2, 3)\n",
    "val x1 = Seq(3, 4, 5, 8)\n",
    "plot.add(new Area { x = x0; y = ys })\n",
    "plot.add(new Area { x = x1; y = ys; color = new Color(128, 128, 128, 50); interpolation = 0 })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val p = new Plot()\n",
    "p.add(new Line { y = Seq(3, 6, 12, 24); displayName = \"Median\" })\n",
    "p.add(new Area { y = Seq(4, 8, 16, 32); base = Seq(2, 4, 8, 16); color = new Color(255, 0, 0, 50); displayName = \"Q1 to Q3\" })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val y1 = Seq(1,5,3,2,3)\n",
    "val y2 = Seq(7,2,4,1,3)\n",
    "val p = new Plot { title = \"Plot with XYStacker\"; initHeight = 200 }\n",
    "val a1 = new Area{ y = y1; displayName = \"y1\" }\n",
    "val a2 = new Area { y = y2; displayName = \"y2\" }\n",
    "p.add(XYStacker.stack(Seq(a1, a2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val p = new Plot ()\n",
    "p.add(new Line { y = Seq(-1, 1) })\n",
    "p.add(new ConstantLine { x = 0; y = 0.65; style = StrokeType.DOT; color = Color.blue })\n",
    "p.add(new ConstantLine { x = 0; y = 1; style =  StrokeType.DASHDOT; color = Color.blue })\n",
    "p.add(new ConstantLine { x = 1; y =  0.4; color = Color.gray; width =  5;  showLabel = true })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val constBand = new ConstantBand { x = Seq(1, 2); y = Seq(1, 3) }\n",
    "val lineVal = new Line { y = Seq(-3, 1, 3, 4, 5) }\n",
    "val plot = new Plot()\n",
    "plot.add(lineVal)\n",
    "plot.add(constBand)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val p = new Plot() \n",
    "p.add(new Line { x = Seq(-3, 1, 2, 4, 5); y = Seq(4, 2, 6, 1, 5) })\n",
    "p.add(new ConstantBand { x = Seq(Double.NegativeInfinity, 1); color = new Color(128, 128, 128, 50) })\n",
    "p.add(new ConstantBand { x = Seq(1, 2) })\n",
    "p.add(new ConstantBand { x = Seq(4, Double.PositiveInfinity) })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val plot = new Plot()\n",
    "val xs = Seq(1,2,3,4,5,6,7,8,9,10)\n",
    "val ys = Seq(8.6, 6.1, 7.4, 2.5, 0.4, 0.0, 0.5, 1.7, 8.4, 1)\n",
    "\n",
    "plot.add(new Line { x = xs; y = ys })\n",
    "\n",
    "def label(i: Int) : String = { \n",
    "  if (ys(i) > ys(i+1) && ys(i) > ys(i-1)) return \"max\"\n",
    "  if (ys(i) < ys(i+1) && ys(i) < ys(i-1)) return \"min\"\n",
    "  if (ys(i) > ys(i-1)) return \"rising\"\n",
    "  if (ys(i) < ys(i-1)) return \"falling\"\n",
    "  return \"\"\n",
    "}\n",
    "\n",
    "for (i <- 0 to xs.size) {\n",
    "  if (i > 0 && i < xs.size - 1) {\n",
    "    plot.add(new Text { x = xs(i);  y = ys(i); text = label(i); pointerAngle = -i/3.0 })\n",
    "  }\n",
    "}\n",
    "\n",
    "plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val ch = new Crosshair { color = new Color(255, 128, 5); width = 2; style = StrokeType.DOT }\n",
    "val pp = new Plot {\n",
    "    crosshair = ch\n",
    "    omitCheckboxes = true\n",
    "    legendLayout = LegendLayout.HORIZONTAL\n",
    "    legendPosition = LegendPosition.TOP\n",
    "}\n",
    "def xs = Seq(1, 4, 6, 8, 10)\n",
    "def ys = Seq(3, 6, 4, 5, 9)\n",
    "pp.add(new Line { displayName = \"Line\"; x = xs; y = ys; width = 3 })\n",
    "pp.add(new Bars { displayName = \"Bar\"; x = Seq(1,2,3,4,5,6,7,8,9,10); y = Seq(2, 2, 4, 4, 2, 2, 0, 2, 2, 4); width = 0.5 })\n",
    "pp.add(new Points { x = xs; y = ys; size = 10; toolTip = Seq(\"x = \",\"y = \") })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val rates = new CSV().readFile(\"../../../doc/resources/data/interest-rates.csv\")\n",
    "\n",
    "new SimpleTimePlot {\n",
    "    data = rates\n",
    "    columns = Seq(\"y1\", \"y10\")\n",
    "    yLabel = \"Price\"\n",
    "    displayNames = Seq(\"All\", \"1 Year\", \"10 Year\")\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val points = 100\n",
    "val logBase = 10\n",
    "\n",
    "val xs = for (i <- 0 to points) yield i / 15.0\n",
    "val expys = for (x <- xs) yield math.exp(x)\n",
    "\n",
    "val cplot = new CombinedPlot()\n",
    "val logYPlot = new Plot {\n",
    "    title = \"Linear x, Log y\"\n",
    "    xLabel = \"Log\"\n",
    "    logY=true\n",
    "    yLogBase = logBase\n",
    "}\n",
    "logYPlot.add(new Line { displayName = \"f(x) = exp(x)\"; x = xs; y = expys; width = 3.0f })\n",
    "logYPlot.add(new Line { displayName = \"g(x) = x\"; x = xs; y = xs; width = 3.0f })\n",
    "\n",
    "cplot.add(logYPlot, 3)\n",
    "\n",
    "val linearYPlot = new Plot {\n",
    "    title = \"Linear x, Linear y\"\n",
    "    xLabel = \"Linear\"\n",
    "    yLabel = \"Linear\"\n",
    "}\n",
    "linearYPlot.add(new Line { displayName = \"f(x) = exp(x)\"; x = xs; y = expys; width = 3.0f })\n",
    "linearYPlot.add(new Line { displayName = \"g(x) = x\"; x = xs; y = xs; width = 3.0f })\n",
    "cplot.add(linearYPlot, 3);\n",
    "\n",
    "cplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val points = 100\n",
    "val logBase = 10\n",
    "val xs = for (i <- 0 to points) yield i / 15.0\n",
    "val expys = for (x <- xs) yield math.exp(x)\n",
    "\n",
    "val plot = new Plot { \n",
    "    title = \"Log x, Log y\"\n",
    "    xLabel = \"Log\"\n",
    "    yLabel = \"Log\"\n",
    "    logX = true\n",
    "    xLogBase = logBase\n",
    "    logY = true\n",
    "    yLogBase = logBase\n",
    "}\n",
    "\n",
    "plot.add(new Line { displayName = \"f(x) = exp(x)\"; x = xs; y = expys; width = 3.0f })\n",
    "plot.add(new Line { displayName = \"g(x) = x\"; x = xs; y = xs; width = 3.0f })\n",
    "plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import java.util.{Calendar, Date}\n",
    "import java.util.SimpleTimeZone\n",
    "\n",
    "val cal = Calendar.getInstance();\n",
    "cal.add(Calendar.HOUR, -1)\n",
    "\n",
    "val today = new Date()\n",
    "val millis = today.getTime()\n",
    "val hour = 1000 * 60 * 60;\n",
    "\n",
    "val plot = new TimePlot { timeZone = new SimpleTimeZone(10800000, \"America/New_York\") }\n",
    "\n",
    "//list of milliseconds\n",
    "plot.add(new Points { \n",
    "    x = (0 to 10).map(x => millis + hour * x)\n",
    "    y = (0 to 10)\n",
    "    size = 10\n",
    "    displayName = \"milliseconds\"\n",
    "})\n",
    "\n",
    "plot.add(new Points {\n",
    "    x = (0 to 10).map(x => {cal.add(Calendar.HOUR, 1); cal.getTime()})\n",
    "    y = (0 to 10)\n",
    "    size = 5\n",
    "    displayName = \"date objects\"\n",
    "})\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import java.util.Date\n",
    "\n",
    "val today  = new Date()\n",
    "val millis = today.getTime()\n",
    "val nanos  = millis * 1000 * 1000// g makes it arbitrary precision\n",
    "val np = new NanoPlot()\n",
    "\n",
    "np.add(new Points {\n",
    "    x = (0 to 10).map(x => nanos + 7 * x)\n",
    "    y = (0 to 10)\n",
    "})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import scala.util.Random\n",
    "\n",
    "val r = new Random()\n",
    "val p = new Plot {\n",
    "    title = \"Advanced Plot Styling\"\n",
    "    labelStyle = \"font-size:32px; font-weight: bold; font-family: courier; fill: green;\"\n",
    "    gridLineStyle = \"stroke: purple; stroke-width: 3;\"\n",
    "    titleStyle = \"color: green;\"\n",
    "}\n",
    "\n",
    "p.add(new Points {\n",
    "    x = (1 to 1000).map(x => r.nextGaussian() * 10.0d)\n",
    "    y = (1 to 1000).map(x => r.nextGaussian() * 20.0d)\n",
    "})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import java.nio.file.Files\n",
    "import java.io.File\n",
    "\n",
    "val picture: Array[Byte] = Files.readAllBytes(new File(\"../../../doc/resources/img/widgetArch.png\").toPath())\n",
    "\n",
    "var p =  new Plot();\n",
    "// x y width height are coordinates, opacity is a double in 0~1\n",
    "\n",
    "// image can be loaded via bytes, filepath, or url\n",
    "p.add(new Rasters { \n",
    "    x = List(-10,3)\n",
    "    y = List(3,1.5)\n",
    "    height = List(6,5)\n",
    "    width = List(10,8)\n",
    "    opacity = List(1,0.5)\n",
    "    dataString = picture \n",
    "})\n",
    "//p << new Rasters(x: -1, y: 4.5, width: 5, height: 8, opacity:0.5, filePath: \"widgetArch.png\");\n",
    "p.add(new Rasters {\n",
    "    x = List(-4)\n",
    "    y = List(10.5)\n",
    "    height = List(2)\n",
    "    width = List(10)\n",
    "    opacity = List(1)\n",
    "    fileUrl = \"https://www.twosigma.com/static/img/twosigma.png\"\n",
    "})\n",
    "\n",
    "// a list of images!\n",
    "val xs = List(-8, -5, -3, -2, -1, 1, 2, 4, 6, 8)\n",
    "val ys = List(4, 5, 1, 2, 0 ,3, 6, 4, 5, 9)\n",
    "val widths = List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)\n",
    "val opacities = List(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1)\n",
    "p.add(new Rasters {\n",
    "    x = xs\n",
    "    y = ys\n",
    "    width = widths\n",
    "    height = widths\n",
    "    opacity = opacities\n",
    "    fileUrl = \"http://icons.iconarchive.com/icons/paomedia/small-n-flat/1024/sign-check-icon.png\"\n",
    "})\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "val plot = new Plot { title = \"Setting 2nd Axis bounds\" }\n",
    "val ys = List(0, 2, 4, 6, 15, 10)\n",
    "val ys2 = List(-40, 50, 6, 4, 2, 0)\n",
    "val ys3 = List(3, 6, 3, 6, 70, 6)\n",
    "plot.add(new YAxis())\n",
    "plot.add(new Line { y = ys })\n",
    "plot.add(new Line { y = ys2; displayName = \"Spread\" })\n",
    "\n",
    "plot.getYAxes().get(0).setBound(1,5)\n",
    "\n",
    "plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Scala",
   "language": "scala",
   "name": "scala"
  },
  "language_info": {
   "codemirror_mode": "text/x-scala",
   "file_extension": ".scala",
   "mimetype": "",
   "name": "Scala",
   "nbconverter_exporter": "",
   "version": "2.12.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": false,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": false,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
